/**
 * Copyright (c) 2020 Coder League
 * All rights reserved.
 *
 * File：NosessionRequestController.java
 * History:
 *         2020年12月19日: Initially created, Chrise.
 */
package club.coderleague.cfss.controller;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import club.coderleague.cfss.annotations.PassiveRequest;
import club.coderleague.cfss.annotations.Request;
import club.coderleague.cfss.controller.interfaces.WeixinInterfaceController;
import club.coderleague.cfss.domain.beans.CybercafeRegisterRequest;
import club.coderleague.cfss.domain.beans.SupplierRegisterRequest;
import club.coderleague.cfss.domain.beans.WebAuthContext;
import club.coderleague.cfss.service.area.AreaService;
import club.coderleague.cfss.service.cybercafe.CybercafeService;
import club.coderleague.cfss.service.main.MainService;
import club.coderleague.cfss.service.supplier.SupplierService;
import club.coderleague.cfss.service.user.UserService;
import club.coderleague.cfss.util.CommonUtil;

/**
 * 无会话请求控制器。
 * @author Chrise
 */
@Controller
@RequestMapping(NosessionRequestController.REQUEST_PREFIX)
public class NosessionRequestController extends IndexController {
	/**
	 * 请求前缀。
	 */
	public static final String REQUEST_PREFIX = IndexController.REQUEST_PREFIX + "/nr";
	
	private static final String VERICODE_KEY = "vericode_key";
	
	@Autowired
	private UserService userService;
	@Autowired
	private MainService mainService;
	@Autowired
	private AreaService areaService;
	@Autowired
	private SupplierService supplierService;
	@Autowired
	private CybercafeService cybercafeService;
	
	/**
	 * 生成验证码。
	 * @author Chrise 2020年12月19日
	 * @return 验证码数据流。
	 */
	@ResponseBody
	@GetMapping("/vericode.xhtml")
	@Request("请求生成验证码")
	public StreamingResponseBody genVericode() {
		Map<String, BufferedImage> vericode = CommonUtil.genVericode();
		
		String codenum = vericode.keySet().iterator().next();
		getSession().setAttribute(VERICODE_KEY, codenum);
		
		BufferedImage codeimg = vericode.get(codenum);
		return new StreamingResponseBody() {
			public void writeTo(OutputStream outputStream) throws IOException {
				ImageIO.write(codeimg, "jpeg", outputStream);
			}
		};
	}
	
	/**
	 * 登录。
	 * @author Chrise 2020年12月19日
	 * @param username 用户名。
	 * @param userphone 用户电话。
	 * @param password 密码。
	 * @param vericode 验证码。
	 * @param loginmode 登录模式。
	 * @return 登录结果。
	 * @throws Exception 登录处理异常。
	 */
	@ResponseBody
	@PostMapping("/login.xhtml")
	@Request("请求登录系统")
	public ModelMap login(String username, String userphone, String password, String vericode, boolean loginmode) throws Exception {
		HttpSession session = getSession();
		String cachecode = (String)session.getAttribute(VERICODE_KEY);
		
		String message = this.userService.execUserLogin(username, userphone, password, vericode, loginmode, cachecode, session);
		if (message != null && !"".equals(message)) return createModel(false, message);
		
		return createModel(true, message);
	}
	
	/**
	 * 移动端登录系统。
	 * @author Chrise 2020年12月27日
	 * @param userphone 用户电话。
	 * @param vercode 验证码。
	 * @param boundwx 是否绑定微信。
	 * @return 登录结果。
	 */
	@ResponseBody
	@PostMapping("/mlogin.xhtml")
	@Request("移动端登录系统")
	public ModelMap mlogin(String userphone, String vercode, boolean boundwx) {
		Object result = this.userService.execMobileUserLogin(userphone, vercode, boundwx, getSession());
		if (result instanceof WebAuthContext) return super.createModel(true, ((WebAuthContext)result).getRedirect());
		return super.createModel(false, result);
	}
	
	/**
	 * 前往登录修改密码页面。
	 * @author Chrise 2020年12月22日
	 * @return 页面路径。
	 */
	@GetMapping("/goLoginUpdatePassword.xhtml")
	@Request("前往登录修改密码页面")
	public String goLoginUpdatePassword() {
		getRequest().setAttribute("loginOperate", true);
		return "/pc/main/passwordEditPage";
	}
	
	/**
	 * 登录修改用户密码。
	 * @author Chrise 2020年12月22日
	 * @param oldpassword 原密码。
	 * @param newpassword 新密码。
	 * @return 修改结果。
	 */
	@ResponseBody
	@PostMapping("/updatePassword.xhtml")
	@Request("登录修改用户密码")
	public ModelMap updatePassword(String oldpassword, String newpassword) {
		this.mainService.updatePassword(oldpassword, newpassword, true);
		return super.createModelOnlyStatus(true);
	}
	
	/**
	 * 前往注册页面。
	 * @author Chrise 2020年12月25日
	 * @return 页面路径。
	 */
	@GetMapping("/register.xhtml")
	@Request("前往注册页面")
	public String goMobileRegister() {
		WebAuthContext context = (WebAuthContext)getSession().getAttribute(WebAuthContext.SESSION_KEY);
		if (context == null) return "redirect:" + WeixinInterfaceController.REQUEST_PREFIX + WeixinInterfaceController.AUTH_EXPIRE_REQUEST_SUFFIX;
		
		switch (context.getScene()) {
			case SUPPLIER_SYSTEM:
				return "/mobile/supplier/register";
			case CYBERCAFE_SYSTEM:
				return "/mobile/cybercafe/register";
			default:
				return "redirect:" + WeixinInterfaceController.REQUEST_PREFIX + WeixinInterfaceController.AUTH_EXPIRE_REQUEST_SUFFIX;
		}
	}
	
	/**
	 * 注册供应商。
	 * @author Chrise 2020年12月27日
	 * @param request 注册请求。
	 * @param buslicense 营业执照。
	 * @param folicense 食品经营许可证。
	 * @param testreport 检测报告。
	 * @param qualityreport 质量报告。
	 * @return 注册结果。
	 */
	@ResponseBody
	@PostMapping("/registerSupplier.xhtml")
	@Request("注册供应商")
	public ModelMap registerSupplier(SupplierRegisterRequest request, MultipartFile buslicense, MultipartFile folicense, MultipartFile testreport, MultipartFile qualityreport) {
		String message = this.supplierService.execRegisterSupplier(request, buslicense, folicense, testreport, qualityreport);
		if (message != null) return super.createModel(false, message);
		
		return super.createModelOnlyStatus(true);
	}
	
	/**
	 * 注册网吧。
	 * @author Chrise 2020年12月30日
	 * @param request 注册请求。
	 * @param buslicense 营业执照。
	 * @return 注册结果。
	 */
	@ResponseBody
	@PostMapping("/registerCybercafe.xhtml")
	@Request("注册网吧")
	public ModelMap registerCybercafe(CybercafeRegisterRequest request, MultipartFile buslicense) {
		String message = this.cybercafeService.execRegisterCybercafe(request, buslicense);
		if (message != null) return super.createModel(false, message);
		
		return super.createModelOnlyStatus(true);
	}
	
	/**
	 * 获取用于移动端选择的区域。
	 * @author Chrise 2020年12月26日
	 * @param parent 父级区域。
	 * @return 区域数据。
	 */
	@ResponseBody
	@PostMapping("/getAreasForSelect.xhtml")
	@PassiveRequest("获取用于移动端选择的区域")
	public ModelMap getAreasForSelect(Long parent) {
		return super.createModel(true, this.areaService.getAreasForMobileSelect(parent));
	}
}
